//
// Created by chen on 2023/6/23.
//
#pragma once
#include "iostream"
#include "map"
#include "vector"
#include "fstream"
#include "time.h"

using namespace std;

#define ROOMFILE "roomFile.csv"   // 储存机房信息文件
#define RESERVATIONFILE "reservationFile.csv"   // 储存机房状态的文件

#ifndef INC_0086ROOMRESERVATION_MACHINEROOM_H
#define INC_0086ROOMRESERVATION_MACHINEROOM_H

#endif //INC_0086ROOMRESERVATION_MACHINEROOM_H

class MachineRoom{
public:
    MachineRoom();

    ~MachineRoom();

    void initRoomReservation();
    void initRoomInfo();
    void initTimeInfo();  // 初始化时间映射关系

    string getInfoByRoomId(string id);

    void saveToFile();

    void applyReservation(string roomId, string timeIndex, string userName);  // 申请预约

    void viewSelfReservation(string userName);   // 查看自身预约信息

    void viewAllReservation();   // 查看所有预约信息

    void cancelReservation(string roomId, string timeIndex, string userName);   // 取消预约

    void checkReservation(string roomId, string timeIndex, string userName, string yesOrNo);   // 审核预约

    void clearAllReservation();   // 清空所有预约信息

    void viewRoomInfo();

private:

    string timeStamp;            // 储存空闲机房文件更新的时间戳

    map<string, string> roomInfo;  // 储存机房id和对应的机房大小，0大号，1中号，2小号
    map<string, string> timeInfo;  // 储存机房使用的时间编号映射，从周一上午到周五下午，1-10

    multimap<string, string> idleRoom;        // 空闲机房，key为机房id，value为从周一上午到周五下午的状态(1-10),在此map中表示当前时间段空闲
    multimap<string, map<string, map<string, string>>> reservationRoom; // 预约中机房，key为机房id，
                                // value为从周一上午到周五下午的状态，value为1，可能同时有多个学生预约一个时间段的同一个机房
    multimap<string, map<string, string>> occupyRoom; // 被占用机房，key为机房id，value为从周一上午到周五下午的状态，value为2
};
